﻿
//namespace cs_basic_14
//{
//    class Incrementer
//    {
//        public event EventHandler CountedDozen;
//        public void DoCont()
//        {
//            for(int i = 1; i < 100; i++)
//            {
//                if(i%12 == 0 && CountedDozen!=null)
//                {
//                    CountedDozen(this, null);
//                }
//            }
//        }
//    }
//    class Dozen
//    {
//        public int DozenCount { get; set; }
//        public Dozen(Incrementer incrementer)
//        {
//            DozenCount = 0;
//            incrementer.CountedDozen += IncrementDozensCount;
//        }
//        private void IncrementDozensCount(object sender, EventArgs e)
//        {
//            DozenCount++;
//        }
//    }
//    internal class Program
//    {
//        static void Main(string[] args)
//        {
//            Incrementer incrementer = new Incrementer();
//            Dozen dozen = new Dozen(incrementer);
//            incrementer.DoCont();
//            Console.WriteLine($"一百里面一共有{dozen.DozenCount}打");
//        }
//    }
//}

//namespace cs_basic_14
//{
//    class Button
//    {
//        public event EventHandler Click;
//        public void OnClick()
//        {
//            string key = Console.ReadLine();
//            if(key == "123")
//            {
//                Click(this, null);
//            }
//        }
//    }
//    class Light
//    {
//        // 订阅按钮点击事件
//        public void Subscribe(Button button)
//        {
//            button.Click += TurnOn;
//        }

//        // 事件处理方法：开灯
//        private void TurnOn(object sender, EventArgs e)
//        {
//            Console.WriteLine("灯亮了！");
//        }
//    }
//    class DoorBell
//    {
//        // 订阅按钮点击事件
//        public void Subscribe(Button button)
//        {
//            button.Click += Ring;
//        }

//        // 事件处理方法：门铃响
//        private void Ring(object sender, EventArgs e)
//        {
//            Console.WriteLine("门铃响了：叮咚~");
//        }
//    }
//    internal class Program
//    {
//        static void Main(string[] args)
//        {
//            Button button = new Button();
//            Light light = new Light();
//            DoorBell doorBell = new DoorBell();
//            light.Subscribe(button);
//            doorBell.Subscribe(button);
//            button.OnClick();
//        }
//    }
//}

//using System;

//namespace cs_basic_14
//{
//    class MessageEventArgs : EventArgs
//    {
//        public string Message { get; set; }
//        public DateTime Time { get; set; }
//        public MessageEventArgs(string message)
//        {
//            Message = message;
//            Time = DateTime.Now;
//        }
//    }
//    class MessageSender
//    {
//        public event EventHandler<MessageEventArgs> MessageSent;
//        public void Send(string message)
//        {
//            Console.WriteLine($"发送消息：{message}");
//            MessageEventArgs messageEventArgs = new MessageEventArgs(message);
//            MessageSent?.Invoke(this, messageEventArgs);
//        }
//    }
//    class MessageReceiver
//    {
//        private string _name;
//        public MessageReceiver(string name)
//        {
//            _name = name;
//        }
//        public void Subscribe(MessageSender sender)
//        {
//            sender.MessageSent += Receive;
//        }
//        private void Receive(object? sender, MessageEventArgs e)
//        {
//            Console.WriteLine($"{_name}收到消息：{e.Message}(时间：{e.Time})");
//        }
//    }
//    class Program
//    {
//        static void Main()
//        {
//            MessageSender sender = new MessageSender();
//            MessageReceiver receiver1 = new MessageReceiver("张三");
//            MessageReceiver receiver2 = new MessageReceiver("李四");
//            receiver1.Subscribe(sender);
//            receiver2.Subscribe(sender);
//            sender.Send("hello");
//            sender.Send("这是一个带数据的事件");
//        }
//    }
//}



//namespace cs_basic_14
//{
//    delegate void ButtonEventHandler();
//    class Button
//    {
//        public event ButtonEventHandler Click;
//        public void OnPress()
//        {
//            Console.WriteLine("按钮被按下了");
//            Click();
//        }
//    }
//    class Light
//    {
//        public void Subscribe(Button button)
//        {
//            button.Click += OpenLight;
//        }

//        private void OpenLight()
//        {
//            Console.WriteLine("灯亮了");
//        }
//    }
//    class DoorBell
//    {
//        public void Subscribe(Button button)
//        {
//            button.Click += OpenDoorBell;
//        }

//        private void OpenDoorBell()
//        {
//            Console.WriteLine("门铃响了");
//        }
//    }
//    class Program
//    {
//        static void Main()
//        {
//            Button button = new Button();
//            Light light = new Light();
//            DoorBell door = new DoorBell();
//            light.Subscribe(button);
//            door.Subscribe(button);
//            button.OnPress();
//        }
//    }
//}

//namespace cs_basic_14
//{
//    class MessageEventArgs : EventArgs
//    {
//        public string message { get; set; }
//        public DateTime time { get; set; }
//        public MessageEventArgs(string message)
//        {
//            this.message = message;
//            time = DateTime.Now;
//        }
//    }
//    class MessageSender
//    {
//        public event EventHandler<MessageEventArgs> MessageSent;
//        public void Send(MessageEventArgs messageEventArgs)
//        {
//            Console.WriteLine("等待消息传输指令：......");
//            string key = Console.ReadLine();
//            if (key == "确认")
//            {
//                MessageSent(this, messageEventArgs);
//            }
//        }
//    }
//    class MessageReceiver
//    {
//        private string name;
//        public MessageReceiver(string name)
//        {
//            this.name = name;
//        }
//        public void Subscribe(MessageSender messageSender)
//        {
//            messageSender.MessageSent += Receive;
//        }

//        private void Receive(object? sender, MessageEventArgs e)
//        {
//            Console.WriteLine($"{name}在{e.time}收到了消息：{e.message}");
//        }
//    }
//    class Program
//    {
//        static void Main()
//        {
//            MessageEventArgs messageEventArgs = new MessageEventArgs("泰国柬埔寨冲突");
//            MessageSender sender = new MessageSender();
//            MessageReceiver receiver1 = new MessageReceiver("张三");
//            MessageReceiver receiver2 = new MessageReceiver("李四");
//            receiver1.Subscribe(sender);
//            receiver2.Subscribe(sender);
//            sender.Send(messageEventArgs);
//        }
//    }
//}

//using System;

//namespace cs_basic_14
//{
//    class PostEventArgs : EventArgs
//    {
//        public string Username { get; set; }
//        public string Content { get; set; }
//        public DateTime Time { get; set; }
//        public PostEventArgs(string username,string Content)
//        {
//            Username = username;
//            this.Content = Content;
//            Time = DateTime.Now;
//        }
//    }
//    class User
//    {
//        public string Name { get;}
//        public event EventHandler<PostEventArgs> NewPostPublished;

//        public User(string username)
//        {
//            Name = username;
//        }
//        public void PubLishPost(string content)
//        {
//            Console.WriteLine($"{Name}发布了新动态：{content}");
//            PostEventArgs e = new PostEventArgs(Name, content);
//            OnNewPostLished(e);
//        }
//        public void OnNewPostLished(PostEventArgs e)
//        {
//            NewPostPublished?.Invoke(this, e);
//        }
//    }
//    class Follower
//    {
//        public string Name { get; set; }
//        public Follower(string name)
//        {
//            Name=name;
//        }
//        public void Follow(User user)
//        {
//            user.NewPostPublished += ReceivePostNotification;
//            Console.WriteLine($"{Name}订阅了{user.Name}");
//        }
//        public void UnFollow(User user)
//        {
//            user.NewPostPublished -= ReceivePostNotification;
//            Console.WriteLine($"{Name}取消订阅了{user.Name}");
//        }

//        private void ReceivePostNotification(object? sender, PostEventArgs e)
//        {
//            Console.WriteLine($"{e.Time}收到通知：{e.Username}发布了新动态{e.Content}");
//        }
//    }
//    class Program
//    {
//        static void Main(string[] args)
//        {
//            User user = new User("程序员小王");
//            Follower follower1 = new Follower("张三");
//            Follower follower2 = new Follower("李四");
//            Follower follower3 = new Follower("王五");
//            follower1.Follow(user);
//            follower2.Follow(user);
//            follower3.Follow(user);
//            user.PubLishPost("我发现了可以很好的理解c#事件的方法");
//        }
//    }
//}

namespace cs_basic_14
{
    class TemperatureChangedEventArgs : EventArgs
    {
        public float NewTemperature { get; }
        public float OldTemperature { get; }
        public DateTime Time { get; }
        public TemperatureChangedEventArgs(float oldTemp,float newTemp)
        {
            NewTemperature = newTemp;
            OldTemperature = oldTemp;
            Time = DateTime.Now;
        }
    }
    class TemperatureSensor
    {
        private float _currentTemperature;
        public event EventHandler<TemperatureChangedEventArgs> TemperatureChanged;
        public TemperatureSensor(float initialTemp)
        {
            _currentTemperature = initialTemp;
            Console.WriteLine($"温度初始化，初始值：{_currentTemperature}°C");
        }
        public void UpdateTemperature(float newTemperature)
        {
            if (newTemperature != _currentTemperature)
            {
                float oldTemp = _currentTemperature;
                _currentTemperature = newTemperature;

                // 温度变化时触发事件
                OnTemperatureChanged(oldTemp, newTemperature);
            }
        }
        protected virtual void OnTemperatureChanged(float oldTemp, float newTemp)
        {
            // 创建事件参数并传递温度数据
            var args = new TemperatureChangedEventArgs(oldTemp, newTemp);
            // 触发事件，通知所有订阅者
            TemperatureChanged?.Invoke(this, args);
        }

    }
    // 3. 事件订阅者1：智能空调
    class SmartAirConditioner
    {
        public string RoomName { get; }

        public SmartAirConditioner(string roomName)
        {
            RoomName = roomName;
        }

        // 订阅温度传感器的事件
        public void ConnectToSensor(TemperatureSensor sensor)
        {
            sensor.TemperatureChanged += OnTemperatureChanged;
            Console.WriteLine($"{RoomName}的空调已连接到温度传感器");
        }

        // 处理温度变化事件
        private void OnTemperatureChanged(object sender, TemperatureChangedEventArgs e)
        {
            Console.WriteLine($"\n[{e.Time:HH:mm:ss}] {RoomName}温度变化：{e.OldTemperature}°C → {e.NewTemperature}°C");

            // 根据温度自动调节
            if (e.NewTemperature > 26)
            {
                Console.WriteLine($"{RoomName}空调：温度过高，自动开启制冷模式");
            }
            else if (e.NewTemperature < 20)
            {
                Console.WriteLine($"{RoomName}空调：温度过低，自动开启制热模式");
            }
            else
            {
                Console.WriteLine($"{RoomName}空调：温度适宜，无需调节");
            }
        }
    }
    // 4. 事件订阅者2：加湿器
    class Humidifier
    {
        public string Name { get; }

        public Humidifier(string name)
        {
            Name = name;
        }

        // 订阅温度传感器的事件
        public void ConnectToSensor(TemperatureSensor sensor)
        {
            sensor.TemperatureChanged += OnTemperatureChanged;
            Console.WriteLine($"{Name}已连接到温度传感器");
        }

        // 处理温度变化事件
        private void OnTemperatureChanged(object sender, TemperatureChangedEventArgs e)
        {
            // 温度过高时提醒加湿
            if (e.NewTemperature > 28)
            {
                Console.WriteLine($"{Name}：温度过高，空气可能干燥，建议开启加湿");
            }
        }
    }
    class Program
    {
        static void Main()
        {
            // 创建温度传感器（发布者）
            var sensor = new TemperatureSensor(22.5f);

            // 创建订阅者
            var livingRoomAc = new SmartAirConditioner("客厅");
            var bedroomAc = new SmartAirConditioner("卧室");
            var humidifier = new Humidifier("卧室加湿器");

            // 订阅事件（设备连接到传感器）
            livingRoomAc.ConnectToSensor(sensor);
            bedroomAc.ConnectToSensor(sensor);
            humidifier.ConnectToSensor(sensor);

            // 模拟温度变化
            Console.WriteLine("\n--- 1小时后温度变化 ---");
            sensor.UpdateTemperature(27.3f);

            Console.WriteLine("\n--- 2小时后温度变化 ---");
            sensor.UpdateTemperature(29.1f);

            Console.WriteLine("\n--- 3小时后温度变化 ---");
            sensor.UpdateTemperature(19.5f);
        }
    }
}